#ifndef __MY_HOT__
#define __MY_HOT__
#include <unistd.h>
#include "data.hpp"

extern cloud::DataManager *_data;

namespace cloud
{
	class HotManager
	{
	private:
		std::string _back_dir;
		std::string _pack_dir;
		std::string _pack_suffix;
		int _hot_time;

	private:
		// 非热点文件-返回真；热点文件-返回假
		bool HotJudge(const std::string &filename) // 判断热点时间
		{
			FileUtil fu(filename);
			time_t last_atime = fu.LastATime();
			time_t cur_time = time(NULL);
			if (cur_time - last_atime > _hot_time)
			{
				return true;
			}
			return false;
		}

	public:
		// 构造函数
		HotManager()
		{
			Config *config = Config::GetInstance();
			_back_dir = config->GetBackDir();
			_pack_dir = config->GetPackDir();
			_pack_suffix = config->GetPackFileSuffix();
			_hot_time = config->GetHotTime();

			FileUtil tmp1(_back_dir);
			FileUtil tmp2(_pack_dir);
			tmp1.CreateDirectory(); // 创建目录     得要有目录，不然不存在到遍历时就会报错
			tmp2.CreateDirectory();
		}

		bool RunModule()
		{
			while (1)
			{
				// 1. 遍历备份目录，获取所有文件名
				FileUtil fu(_back_dir); /////////////////////创建一个操作工具对象 fu，它默认操作 _back_dir 目录下的文件
				std::vector<std::string> array;
				fu.ScanDirectory(&array); // 遍历的所有文件的 相对路径 放到了array数组中
				// 2. 遍历判断文件是否是非热点文件
				for (auto &e : array)
				{
					if (HotJudge(e) == false)
					{
						continue; // 热点文件则不需要特别处理
					}

					// 3.2 获取文件的备份信息     此时就需要BackupInfo了
					BackupInfo bi;
					if (_data->GetOneByRealPath(e, &bi) == false) // 通过array中的一个路径来找一个文件(bi)的备份信息
					{
						// ==false --》 特殊:现在有一个文件存在，但是没有备份信息  (上传了一个文件,但是备份信息丢了)
						bi.NewBackupInfo(e); // 设置一个新的备份信息出来
					}

					// 3.1 对非热点文件进行压缩处理 -- 但此时发现需要一个压缩包的名称
					FileUtil tmp(e);
					tmp.Compress(bi.pack_path); // 文件的压缩包的存储路径
					// 4. 删除源文件，修改备份信息
					tmp.Remove();
					bi.pack_flag = true;
					_data->Update(bi);
				}
				usleep(1000); // 避免空目录循环遍历，消耗cpu资源过高
			}
			return true;
		}
	};
}

#endif
